﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.IO;

namespace Maestro_Proveedores.Forms
{
    public partial class EjecutarScript : Form
    {
        /// <summary>
        /// Identificador del formulario, esta variable utilizada para controlar el acceso al formulario y para realizar la auditoria
        /// </summary>
        public static string TIPO = "105";
        /// <summary>
        /// <para>Formulario utilizado para ejecutar sentencias SQL de mantenimiento sobre la base de datos asociada al maestro de proveedores.</para>
        /// <para>Cabe apuntar que este formualario solo ejecuta sentencias sobre las tablas del maestro de proveedores.</para>
        /// <para>El acceso a este formulario esta restringido a los usuarios AWILCHES y DIN.</para>
        /// </summary>
        public EjecutarScript()
        {
            InitializeComponent();
        }

        private void ejecutarButton_Click(object sender, EventArgs e)
        {
               
            Cursor.Current = Cursors.WaitCursor;
            //--verifico que se halla digitado algo en textBox
            if (this.SQLTextBox.Text.Equals(string.Empty))
                return;
            //--preparo el mensaje
            string msn = "Esta consulta se ejecutara en el servidor.\n¿Desea ejecutarla?\n\n{0}\n{1}";
            string[] temp = Maestro_Proveedores.Properties.Settings.Default.PRV_ConnectionString.Split(';');
            foreach (string t in temp)
                if (t.Contains("Data Source"))
                    msn = msn.Replace("{0}", t);
                else if (t.Contains("Initial Catalog"))
                    msn = msn.Replace("{1}", t);
            //-- confirmo la ejecucion del query
            if (MessageBox.Show(msn, "", MessageBoxButtons.YesNo).Equals(DialogResult.No))
            {
                return;
            }
            
            try
            {
                //-- inicializo la conexion y la transaccion.
                SqlTransaction transaction = null;
                String conString = Maestro_Proveedores.Properties.Settings.Default.PRV_ConnectionString;
                
                using (SqlConnection connection = new SqlConnection(conString))
                {                       
                    connection.Open();
                    SqlCommand command = connection.CreateCommand();
                    //-- inicializo la transaccion
                    transaction = connection.BeginTransaction("Transaccion");
                    command.Connection = connection;
                    //-- asocio la transaccion al comando
                    command.Transaction = transaction;   
                    //-- separo las lineas
                    string[] separator = { "\r\n" };
                    string[] lineas = this.SQLTextBox.Text.Split(separator, StringSplitOptions.RemoveEmptyEntries);
                    //-- ejecuto la consulta teniendo en cuenta la sentencia GO, es decir, cada vez que encuentro una linea con la palabra reservada GO, ejecuto el query acumulado
                    string query = string.Empty;
                    foreach (string linea in lineas)
                    {
                        //-- si encuentro la sentencia GO y ya se ha definido un texto, ejecuto la consulta en el servidor
                        if (linea.Trim().ToUpper().Equals("GO"))
                        {
                            if (!query.Trim().Equals(string.Empty))
                            {
                                command.CommandText = query;
                                command.ExecuteNonQuery();
                                query = string.Empty;
                            }
                        }
                        //--- agrego la nueva linea a la sentencia...
                        else
                            query += linea + "\r\n";
                    }
                    if (!query.Trim().Equals(string.Empty))
                    {
                        command.CommandText = query;
                        command.ExecuteNonQuery();
                        query = string.Empty;
                    }
                    //-- si todo salio bien, confirmo la transaccion.
                    transaction.Commit();
                    MessageBox.Show("El script se ejecuto correctamente.");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("El script no se ejecuto correctamente.\n\nERROR:\n"+ex.Message);
            }
            Cursor.Current = Cursors.Default;
        }

        private void openFilePictureBox_Click(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor;
            try
            {
                //--crear el nuevo archivo
                OpenFileDialog saveFileDialog = new OpenFileDialog();
                saveFileDialog.Filter = "(*.SQL)|*.sql";//"txt files (*.txt)|*.txt|All files (*.*)|*.*";
                saveFileDialog.FilterIndex = 0;
                saveFileDialog.RestoreDirectory = true;
                saveFileDialog.Multiselect = false;

                if (saveFileDialog.ShowDialog() != DialogResult.OK)
                {
                    return;
                }
                StreamReader sr = new StreamReader(saveFileDialog.FileName);
                this.SQLTextBox.Text = sr.ReadToEnd();
                sr.Close();
            }
            catch (Exception ex)
            {
                herramientas.MessageException.show(ex);
            }
            Cursor.Current = Cursors.Default;
        }

        private void SavePictureBox_Click(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor;
            try
            {
                //--crear el nuevo archivo
                SaveFileDialog saveFileDialog = new SaveFileDialog();
                saveFileDialog.Filter = "(*.SQL)|*.sql";//"txt files (*.txt)|*.txt|All files (*.*)|*.*";
                saveFileDialog.FilterIndex = 0;
                saveFileDialog.RestoreDirectory = true;

                if (saveFileDialog.ShowDialog() != DialogResult.OK)
                {
                    return;
                }
                //--instanciar el archivo (si el archivo existe, lo sobreescribe)
                StreamWriter sw = new StreamWriter(saveFileDialog.FileName, false);
                //--copiar texto en el archivo
                sw.Write(this.SQLTextBox.Text);
                sw.Close();
            }
            catch (Exception ex)
            {
                herramientas.MessageException.show(ex);
            }
            Cursor.Current = Cursors.Default;
        }
        
        private void limpiar_Click(object sender, EventArgs e)
        {
            this.SQLTextBox.Text = string.Empty;
        }

        private void helpPictureBox_Click(object sender, EventArgs e)
        {
            Help.ShowHelp(this, ConfiguracionDelSistema.manualDeUsuario, HelpNavigator.TableOfContents);
        }

        private void comoSeHaceLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            try
            {
                System.Diagnostics.Process.Start(ConfiguracionDelSistema.directorioVideoTutoriales + "administracion_ejecutarScript.wmv");
            }
            catch (Exception ex)
            {
                herramientas.MessageException.show(ex);
            }
        }
    }
}
